package testes.vSys.jUnitTestes;

import java.io.File;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Collection;
import java.util.Vector;

import org.hsqldb.Record;

import junit.framework.*;

import testes.vSys.dao._hsql_ModelDao;
import testes.vSys.database.DatabaseController;
import testes.vSys.bean.Model;
import testes.vSys.bean.Brand;

import testes.vSys.database.DatabaseConnection;
import testes.vSys.database.DatabaseController;

public class _hsql_ModelDAOTest_A1 extends TestCase{
	private _hsql_ModelDao MD;
	private DatabaseConnection conn;
	
	public final void setUp() {
		if(!DatabaseController.initiate(new File("./").getAbsolutePath() + "/../VSys/WEB-INF/databaseConnection.properties"))
			System.err.println("ERRO!! Conexão com o banco de dados não iniciada." + new File("./").getAbsolutePath() + "/VSys/WEB-INF/databaseConnection.properties");

		MD = new _hsql_ModelDao();
		
		try {
			conn = DatabaseController.getConnection();
		} catch (Exception e) {
        	e.printStackTrace();
        }
	}
	
	public final void tearDown() {
		if (conn != null) {
			conn.close();
		}
	}
	
	public void testRemoveExistingModel() {
		Brand B = new Brand("DGSBrand");
		Brand RB = MD.createBrand(B);
		Model M = new Model(RB, null, "DGSModel");
		Model RM;
		
		RM = MD.createModel(M);
		MD.removeModel(RM.getId());
		
		// testa se excluiu corretamente
		assertNull("Método removeModel não remove corretamente um modelo", MD.getModelById(RM.getId()));
	}

	public void testRemoveInexistentModel() {
		Brand B = new Brand("DGSBrand");
		Brand RB = MD.createBrand(B);
		Model M = new Model(RB, null, "DGSModel");
		Model RM;
		
		RM = MD.createModel(M);
		MD.removeModel(RM.getId());
		
		// testa exclusão de modelo inexistente
		assertFalse("Método removeModel remove um modelo inexistente.", MD.removeModel(RM.getId()));
	}	
	
	public void testRemoveExistingBrand() {
		Brand B = new Brand("DGSBrand");
		Brand RB;
		
		RB = MD.createBrand(B);
		MD.removeBrand(RB.getId());
		
		// testa se excluiu corretamente
		assertNull("Método removeBrand não remove corretamente uma marca.", MD.getBrandById(RB.getId()));
	}

	public void testRemoveRelatedBrand() {
		Brand B = new Brand("DGSBrand");
		Model RM;
		Brand RB;
		
		RB = MD.createBrand(B);
		Model M = new Model(RB, null, "DGSModel");
		RM = MD.createModel(M);
		MD.removeBrand(RB.getId());
		
		// testa se não exclui quando a marca possui modelo(s) associado(s)
		assertNotNull("Método removeBrand remove marca relacionada a um modelo.", MD.getBrandById(RB.getId()));
	}

	public void testRemoveInexistentBrand() {
		Brand B = new Brand("DGSBrand");
		Brand RB;
		
		RB = MD.createBrand(B);
		MD.removeBrand(RB.getId());
		
		// testa se excluiu corretamente
		assertFalse("Método removeBrand remove uma marca inexistente.", MD.removeBrand(RB.getId()));
	}
	
	public void testGetAvaiableModels() {
		ResultSet rs = null;
		int numModels = 0;

        try {
            String sql = "SELECT count(*) FROM vs_model;";
            rs = conn.executeQuery(sql);
            
            if (rs.next()) {
            	numModels = rs.getInt(1);
            }
        } catch (Exception e) {
        	e.printStackTrace();
        }
        
        assertEquals("Método getAvaiableModels retorna número de modelos incorreto.",MD.getAvaiableModels().size(),numModels);
	}
	
	public void testGetAvailableCarTypes() {
		ResultSet rs = null;
		int numCarTypes = 0;

        try {
            String sql = "SELECT count(*) FROM vs_vehicle_type;";
            rs = conn.executeQuery(sql);
            
            if (rs.next()) {
            	numCarTypes = rs.getInt(1);
            }
        } catch (Exception e) {
        	e.printStackTrace();
        }
        
        assertEquals("Método getAvailableCarTypes retorna número de car types incorreto.",MD.getAvailableCarTypes().size(),numCarTypes);		
	}
	
	/*
	 * Test method for 'testes.vSys.dao._hsql_ModelDao.getAvaiableBrands()'
	 */
	public final void testGetAvaiableBrands() {
		
		ResultSet rs = null;
        int numBrands = 0;

        try {
            String sql = "SELECT count(*) FROM vs_brand;";
            rs = conn.executeQuery(sql);
            
            if (rs.next()) {
            	numBrands = rs.getInt(1);
            }
        } catch (Exception e) {
        	e.printStackTrace();
        }
        
        assertEquals("Método getAvaiableModels retorna número de marcas incorreto.",MD.getAvaiableBrands().size(),numBrands);
    }

	/*
	 * Test method for 'testes.vSys.dao._hsql_ModelDao.getBrandById(int)'
	 */
	public final void testGetBrandByExistingId() {
		
		//Criando objetos de Brand
		Brand novaMarca = new Brand("Teste de Brand");
		novaMarca = MD.createBrand(novaMarca);
		
		//Recupera a marca recém-criada através do ID
		Brand marcaRecuperada = MD.getBrandById(novaMarca.getId());
		
		//Verifica se a marca recuperada está correta
		assertEquals("getBrandById nao buscou a marca corretamente", novaMarca.getId(), marcaRecuperada.getId());
		
		//Remove a marca criada, para não deixar sujeira no bd
		MD.removeBrand(novaMarca.getId());
	}
	
	/*
	 * Test method for 'testes.vSys.dao._hsql_ModelDao.getBrandById(int)'
	 */
	public final void testGetBrandByInexistingId() {
		
		//Criando objetos de Brand 
		Brand novaMarca = new Brand("Teste de Brand");
		novaMarca = MD.createBrand(novaMarca);
		
		//Remove a marca criada do bd
		MD.removeBrand(novaMarca.getId());
		
		//Tenta recuperar a marca recém-criada através do ID
		Brand marcaRecuperada = MD.getBrandById(novaMarca.getId());
		
		//Verifica se a marca recuperada está correta
		assertNull("getBrandById retornou Brand inexistente no bd", marcaRecuperada);
		
	}

	/*
	 * Test method for 'testes.vSys.dao._hsql_ModelDao.getModelById(int)'
	 */
	public final void testGetModelByExistingId() {
		
		//Criando objetos de Brand e Model 
		Brand marca = new Brand("Teste de Brand");
		marca = MD.createBrand(marca);
		Model novoModelo = new Model(marca, null, "Teste de Model");
		
		//Insere o modelo no bd 
		novoModelo = MD.createModel(novoModelo);
		
		//Recupera o modelo recém-criado através do ID
		Model modeloRecuperado = MD.getModelById(novoModelo.getId());
		
		//Verifica se o modelo recuperado está correto
		assertEquals("getModelById nao buscou o modelo corretamente", novoModelo.getId(), modeloRecuperado.getId());
		
		//Remove os objetos criados, para não deixar sujeira no bd
		MD.removeModel(novoModelo.getId());
		MD.removeBrand(marca.getId());

	}

	/*
	 * Test method for 'testes.vSys.dao._hsql_ModelDao.getModelById(int)'
	 */
	public final void testGetModelByInexistingId() {
		
		//Criando objetos de Brand e Model
		Brand marca = new Brand("Teste de Brand");
		marca = MD.createBrand(marca);
		Model novoModelo = new Model(marca, null, "Teste de Model");
		
		//Insere o modelo no bd 
		novoModelo = MD.createModel(novoModelo);
		
		//Remove o modelo do bd
		MD.removeModel(novoModelo.getId());
		
		//Recupera o modelo recém-criado através do ID
		Model modeloRecuperado = MD.getModelById(novoModelo.getId());
		
		//Verifica se o modelo recuperado está correto
		assertNull("getModelById retornou Model inexistente no bd", modeloRecuperado);
		
		//Remove os objetos criados, para não deixar sujeira no bd
		MD.removeBrand(marca.getId());

	}
	
	/*
	 * Test method for 'testes.vSys.dao._hsql_ModelDao.getModelsByBrand(Brand)'
	 */
	public final void testGetModelsByBrand() {

		//Criando objetos de Brand e Model
		Brand marca = new Brand("Teste de Brand");
		marca = MD.createBrand(marca);
		Model novoModelo = new Model(marca, null, "Teste de Model");
		
		//Insere o modelo no bd 
		novoModelo = MD.createModel(novoModelo);
		
		//Recupera o modelo recém-criado através do ID
		Model modeloRecuperado = (Model) MD.getModelsByBrand(marca).toArray()[0];
		
		//Verifica se o modelo recuperado está correto
		assertEquals("GetModelsByBrand nao buscou o modelo corretamente", novoModelo.getId(), modeloRecuperado.getId());
		
		//Remove os objetos criados, para não deixar sujeira no bd
		MD.removeModel(novoModelo.getId());
		MD.removeBrand(marca.getId());

	}
	
	public final void testCreateModel() {
		//Criando objetos de Brand e Model
		Brand marca = new Brand("Teste de Brand");
		marca = MD.createBrand(marca);
		Model novoModelo = new Model(marca, null, "Teste de Model");
		
		//Insere o modelo no bd 
		novoModelo = MD.createModel(novoModelo);
		
		//Recupera o modelo recém-criado através do ID
		Model modeloRecuperado = MD.getModelById(novoModelo.getId());
		
		//Verifica se o modelo recuperado está correto
		assertEquals("Create model não criou modelo corretamente, ou getModelById nao buscou modelo corretamente.", novoModelo.getId(), modeloRecuperado.getId());
		
		//Remove os objetos criados, para não deixar sujeira no bd
		assertTrue("removeModel nao removeu elemento criado",MD.removeModel(novoModelo.getId()));
		assertTrue("removeBrand nao removeu elemento criado",MD.removeBrand(marca.getId()));
	}
	
	
	public final void testCreateModelByNullBrand() {
		//Criando objetos de Brand e Model
		Model novoModelo = new Model(null, null, "Teste de Model");
		
		//Insere o modelo no bd 
		novoModelo = MD.createModel(novoModelo);
		
		//Verifica se o modelo recuperado está correto
		assertNull("createModel criou modelo com marca nula.", novoModelo);		
	}
	
	public final void testCreateModelByNullClass() {
		//Criando objetos de Brand e Model
		Model novoModelo = null;
		
		//Insere o modelo no bd 
		novoModelo = MD.createModel(novoModelo);
		
		//Verifica se o modelo recuperado está correto
		assertNull("createModel criou modelo com marca nula.", novoModelo);		
	}
	
	public final void testCreateBrand() {
		//Criando objetos de Brand e Model
		Brand brand = new Brand("Teste de Brand");
		
		//Insere o modelo no bd 
		brand = MD.createBrand(brand);
		
	
		//Recupera o modelo recém-criado através do ID
		Brand brandRecuperado = MD.getBrandById(brand.getId());
		
		//Verifica se o modelo recuperado está correto
		assertEquals("createBrand criou um modelo erroneamente no banco de dados", brand.getId(), brandRecuperado.getId());
		
        
		//Remove os objetos criados, para não deixar sujeira no bd
		assertTrue("createBrand nao buscou o modelo corretamente",MD.removeBrand(brand.getId()));
		
	}
	
	public final void testCreateBrandByNullClass() {
		//Criando objetos de Brand e Model
		Brand brand = null;

		//Insere o modelo no bd 
		brand = MD.createBrand(brand);
		
		//Verifica se o modelo recuperado está correto
		assertNull("createBrand criou um modelo erroneamente no banco de dados", brand);

	}

}
